/**
 * 文件名：@AbstractUserResolver.java <br/>
 * 包名：cn.efunbox.afw.web <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.efunbox.afw.core.holder.TargetHolder;

/**
 * 类名：AbstractUserResolver  <br />
 *
 * 功能：
 *
 * @author xtwin <br />
 * 创建时间：2016年7月28日 下午5:26:40  <br />
 * @version 2016年7月28日
 */
public abstract class AbstractUserResolver<U> implements UserResolver<U> {
	
	// 日志记录器
	private static final Logger logger = LoggerFactory.getLogger(AbstractUserResolver.class);
	
	// 用户对象保存时，使用的key
	private static final String KEY_USER_REQUEST = "__KEY_USER_REQUEST";
	
	/**
	 * 功能: 解析用户 <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月28日 下午5:26:53<br/>
	 * 
	 * @param request
	 * @return <br/>
	 * @see cn.efunbox.afw.web.UserResolver#resolve(javax.servlet.http.HttpServletRequest)
	 */
	@Override
	public U resolve(HttpServletRequest request) throws Exception {
		// 检查是否已经解析过了
		@SuppressWarnings("unchecked")
		TargetHolder<U> holder = (TargetHolder<U>) request.getAttribute(KEY_USER_REQUEST);
		
		// 若已存在，则直接返回目标对象
		if (null == holder) {
			// 由子类实现解析逻辑
			U user = doResolve(request);
			
			// 记录日志
			logger.debug("The resolve user is : {}", user);
			
			// 创建holder
			holder = new TargetHolder<>(user);
			
			// 缓存holder
			request.setAttribute(KEY_USER_REQUEST, holder);
		}
		
		// 返回用户对象
		return holder.get();
	}

	/**
	 * 功能：解析出当前用户 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月28日 下午5:28:31 <br/>
	 */
	protected abstract U doResolve(HttpServletRequest request) throws Exception;
}
